home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / byte0887.arc / LANE.ARC / TOKENS80.ARI < prev   
Text File  |  1987-05-05  |  3KB  |  80 lines

  1. % Subject: TOKENS80.ARI  - from A. Lane: "Simulating an 8085 with Prolog"
  2.  
  3. %    This version of get_token_list(_) assumes all input numbers are in
  4. %    hexadecimal and delivers decimal numbers in the output.  i.e.,
  5. %    entering  'show 0f' results in [show,15].
  6.  
  7. get_token_list(Result) :-              %   read a sentence from the terminal
  8.         read_line(0,String),           %   read a line of input from the console
  9.         list_text([Char|Tail],String),
  10.         tokenize([Char|Tail], [], Result).
  11.  
  12. tokenize([H|T],List,L) :-              % if head of list starts with letter
  13.         letter(H, Letter),!,
  14.         restword(T,[Letter],Word,Rem), % get the rest of a word
  15.         append(List,[Word],Nlist),
  16.         tokenize(Rem,Nlist,L).         % recurse, tokenize rest of list
  17.  
  18. tokenize([H|T], List, L) :-            % if head of list starts with digit (0-9)
  19.         digit(H),!,
  20.         rest_num(T,[H],Num, Rem),      % get a number (Num will be decimal)
  21.         append(List,[Num],Nlist),
  22.         tokenize(Rem,Nlist,L).         % recurse, tokenize rest of list
  23.  
  24. tokenize([_|T], List, L) :-            % if head of list is not letter or digit,
  25.         !, tokenize(T,List,L).         % ignore it.
  26.  
  27. tokenize([],List,List).                % stop recursion.
  28.  
  29. restword( [H|T], List, Word, X ) :-
  30.         letter( H, Letter ),!,
  31.         append( List, [Letter], Nlist ),
  32.         restword( T, Nlist, Word, X ).
  33.  
  34. restword( [32|T], List, Word, T ) :-
  35.         name( Word, List ),!.
  36.  
  37. restword( [_|T], List, Word, X ) :-
  38.         !, restword( T, List, Word, X ).
  39.  
  40. restword( [], List, Word, [] ) :-
  41.         !, name( Word, List ).
  42.  
  43. rest_num( [H|T], List, Num, X ) :-
  44.         hexdigit( H,_ ) , !,                % rest of number may have 0-9, a-f
  45.         append( List, [H], Nlist ),
  46.         rest_num( T, Nlist, Num, X ).
  47.  
  48. rest_num( [32|T], List, Num, T ) :-         % space finishes number, go convert.
  49.         cname( Num, List, 0 ),!.
  50.  
  51. rest_num( [],List,Num,[]) :-                % nothing left, go convert.
  52.         !, cname(Num, List, 0).
  53.  
  54. cname( F, [X|[]], N) :-                     % finished.
  55.         !, hexdigit(X,Y), F is N + Y.
  56.  
  57. cname( Number, [H|T] ,In ) :-               % convert the input hex number to
  58.         hexdigit(H,H1),                     % a decimal.  User need never know!
  59.         H2 is (In + H1) * 16,
  60.         cname(Number, T, H2).               % recurse with shorter list in T
  61.  
  62. letter(C, C) :-
  63.         C >= 97, C =< 122, !.   %   97 is "a", 122 is "z"
  64. letter(C, D) :-
  65.         C >= 65, C =< 90, !,    %   65 is "A", 90 is "Z"
  66.         D is C + 32.            %   32 is "a"-"A"
  67.  
  68. hexdigit(D,E) :-
  69.         digit(D), E is D - 48.
  70.  
  71. hexdigit(D,F) :-
  72.         letter(D,E), E >= 97, E =< 102,
  73.         F is E - 87.
  74.  
  75. digit(C) :-
  76.         C >= 48, C =< 57.       %   48 is "0", 57 is "9".
  77.  
  78. %
  79. % end: TOKENS80.ARI
  80.